package per.javase.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

//关闭JDBC自动提交机制，使用setAutoCommit、commit、rollback方法
public class JDBCTest04 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");//注册驱动
            conn = DriverManager.getConnection("jdbc:mysql://localhost/bjpowernode","root","19970913Xun");//获取连接
            conn.setAutoCommit(false);//关闭事务自动提交机制
            String sql = "update t_account set balance = ? where card = ? ";
            ps = conn.prepareStatement(sql);//获取数据库操作对象
            ps.setInt(1,10000);
            ps.setInt(2,1);
            int count = ps.executeUpdate();//执行SQL语句

            //String s = null;
            //s.toString();//制造异常，此时出现异常，虽然第一条DML语句已经执行，但是因为关闭了事务自动提交机制，所以第一条语句并未提交，直至整个事务结束才会提交。
            ps = conn.prepareStatement(sql);//获取数据库操作对象
            ps.setInt(1,10000);
            ps.setInt(2,2);
            count += ps.executeUpdate();//执行SQL语句
            System.out.println(count==2?"转账成功":"转账失败");
            conn.commit();// 程序执行到此说明没有问题，手动提交事务

        } catch (ClassNotFoundException e) {
            //出现异常则回滚事务
            if (conn != null) {
                try {
                    conn.rollback();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally{
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException throwables) {
                        throwables.printStackTrace();
                    }

                }
            }
        }
    }
}

